package com.linxz.ui.widgets;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.ViewSwitcher;

import androidx.core.content.ContextCompat;

import com.linxz.ui.R;
import com.linxz.ui.pojo.AdvertisementBean;

import java.util.ArrayList;
import java.util.List;

/**
 * 自动垂直滚动的TextView
 * <p>
 * (活动标签：上下定时切换)
 */
public class AutoVerticalScrollTextView extends TextSwitcher implements ViewSwitcher.ViewFactory {

    private final static int SWITCH_TAG=1001;
    private Context mContext;
    /**mInUp,mOutUp分别构成向下翻页的进出动画*/
    private Rotate3dAnimation mInUp;
    private Rotate3dAnimation mOutUp;
    private long delayMills=3000;
    private int switchCount=1;
    private boolean isSwitch;
    private AdvertisementBean curAdvertisementBean;

    private List<AdvertisementBean> advertisementBeans = new ArrayList<>();

    public AutoVerticalScrollTextView(Context context) {
        this(context, null);
    }

    public AutoVerticalScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mContext = context;
        init();

    }

    private void init() {
        setFactory(this);
        mInUp = createAnim(true, true);
        mOutUp = createAnim(false, true);
        setInAnimation(mInUp);//当View显示时动画资源ID
        setOutAnimation(mOutUp);//当View隐藏是动画资源ID。
    }


    private Rotate3dAnimation createAnim(boolean turnIn, boolean turnUp) {
        Rotate3dAnimation rotation = new Rotate3dAnimation(turnIn, turnUp);
        rotation.setDuration(1200);//执行动画的时间
        rotation.setFillAfter(false);//是否保持动画完毕之后的状态
        rotation.setInterpolator(new AccelerateInterpolator());//设置加速模式
        return rotation;
    }


    /**这里返回的TextView，就是我们看到的View,可以设置自己想要的效果*/
    @Override
    public View makeView() {
        TextView textView = new TextView(mContext);
        textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
        textView.setTextSize(14);
        textView.setSingleLine(true);
        textView.setEllipsize(TextUtils.TruncateAt.END);
        textView.setTextColor(ContextCompat.getColor(mContext, R.color.color_69));
        return textView;
    }

    public void setDelayMills(long delayMills){
        if (delayMills==0){
            return;
        }
        this.delayMills=delayMills;
    }

    //定义动作，向上滚动翻页
    private void next() {
        //显示动画
        if (getInAnimation() != mInUp) {
            setInAnimation(mInUp);
        }
        //隐藏动画
        if (getOutAnimation() != mOutUp) {
            setOutAnimation(mOutUp);
        }
    }


    public void startSwitch(List<AdvertisementBean> advertisementBeans) {
        if (advertisementBeans == null) {
            throw new IllegalArgumentException("advertisement can not be null!");
        }
        this.advertisementBeans = advertisementBeans;
        if (advertisementBeans.size() <= 0) {
            return;
        }
        if (!isSwitch){
           isSwitch=true;
           mHandler.postDelayed(runnable,delayMills);
        }

    }

    private Runnable runnable=new Runnable() {
        @Override
        public void run() {
            Message message=new Message();
            message.what=SWITCH_TAG;
            mHandler.sendMessage(message);
            mHandler.postDelayed(this,delayMills);
        }
    };

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what==SWITCH_TAG){
                switchCount++;
                curAdvertisementBean=advertisementBeans.get(switchCount%advertisementBeans.size());
                next();
                setText(curAdvertisementBean.getMessage());
            }

        }
    };

    public void onDestry(){
        mHandler.removeCallbacks(runnable);
        switchCount=1;
        isSwitch=false;
    }

    class Rotate3dAnimation extends Animation {
        private float mCenterX;
        private float mCenterY;
        private final boolean mTurnIn;
        private final boolean mTurnUp;
        private Camera mCamera;

        public Rotate3dAnimation(boolean turnIn, boolean turnUp) {
            mTurnIn = turnIn;
            mTurnUp = turnUp;
        }

        @Override
        public void initialize(int width, int height, int parentWidth, int parentHeight) {
            super.initialize(width, height, parentWidth, parentHeight);
            mCamera = new Camera();
            mCenterY = getHeight();
            mCenterX = getWidth();
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {

            final float centerX = mCenterX;
            final float centerY = mCenterY;
            final Camera camera = mCamera;
            final int derection = mTurnUp ? 1 : -1;

            final Matrix matrix = t.getMatrix();

            camera.save();
            if (mTurnIn) {
                camera.translate(0.0f, derection * mCenterY * (interpolatedTime - 1.0f), 0.0f);
            } else {
                camera.translate(0.0f, derection * mCenterY * (interpolatedTime), 0.0f);
            }
            camera.getMatrix(matrix);
            camera.restore();

            matrix.preTranslate(-centerX, -centerY);
            matrix.postTranslate(centerX, centerY);
        }
    }

    public AdvertisementBean getCurPosition() {
        return curAdvertisementBean;
    }
}
